浅谈Java中linkedlist和arraylist区别

您所在的位置:网站首页 arraylist和linklist 的区别 浅谈Java中linkedlist和arraylist区别

浅谈Java中linkedlist和arraylist区别

2023-03-10 06:29| 来源: 网络整理| 查看: 265

在Java中,关于集合框架有这样一个体系结构: 其主要由两个接口派生而出:Collection和Map,然后再衍生出各自的一些实现类(比如Collection接口又被继承与Set和List接口,而他们各自又实现了具体的类)。 img 今天我就简要分析一下,实现List的两个类(ArrayList和LinkedList),他们的区别是什么,我们在使用过程中有哪些注意事项。

区别

首先最显要的区别就是,他们的底层结构完全不同,ArrayList底层实现是数组,LinkedList底层实现是链表。这也就导致了他们在对数据操作过程中,会有一定的偏差。

首先抛开这两个类不谈。我们先简单的了解一下数据结构中数组结构和链表结构的优缺点:

数组都是连续的,往往在内存中占据的是一段连续的空间,每一个值对应一个编号(索引值),这就方便我们很快的定位到某个具体元素,或者随机访问值。 我们想要在数组中追加元素,方法有很多种,可以在末尾追加,也可以在任意位置追加,这看似很方便,其实却拖慢了效率。 前文说过数组是一段连续的结构,那么我现在想在中间位置加入一个元素,为了其连续性不被破坏,就必须让其后的元素依次向后挪一位,把这个位置空出来,然后才能插入。删除亦是如此。

链表在内存中就不必是连续的,因为他是通过节点来操作的,就像一条链子一样,对于里面的每个元素而言,只用记住自己前面一个位置和后面一个位置的地址值就可以了。这样我们在插入或者删除的时候,就不用整体挪动了,只需要将他对应的前后节点重新赋值就行了。也就是说在链式结构中是没有索引值这个概念的 但这样也就导致了一个问题,就是我们在查找元素的时候就会相对比较麻烦,因为每个元素只知道自己前后的位置,所以如果我们要找一个元素,需要不断的去遍历,直到找到为止。

在Java中亦是如此,简而言之:

ArrayList更适合查找元素,但不适合插入和删除元素 LinkedList更适合插入和删除元素,但不适合查找

可能我们平时在联系的时候感觉不出来差别,但在处理超多数据的时候效果就明显了。下面我举一个小例子验证一下这个比较结论,在同一位置插入300000个元素:

package day_12_10; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Random; /** * @author soberw * @Classname ListTest * @Description * @Date 2021-12-10 8:40 */ public class ListTest { public static void main(String[] args) { System.out.printf("ArrayList插入300000个元素的时间是:%d\n",arrayAdd()); System.out.printf("LinkedList插入300000个元素的时间是:%d\n",linkAdd()); } public static long arrayAdd() { long start = System.currentTimeMillis(); Random random = new Random(); List arr = new ArrayList(); //添加一个元素 arr.add(1); for (int i = 0; i < 300000; i++) { //在 0 位置添加300000个元素 arr.add(0, random.nextInt(10)); } long end = System.currentTimeMillis(); return end - start; } public static long linkAdd() { long start = System.currentTimeMillis(); Random random = new Random(); List link = new LinkedList(); //添加一个元素 link.add(1); for (int i = 0; i < 300000; i++) { //在 0 位置添加300000个元素 link.add(0, random.nextInt(10)); } long end = System.currentTimeMillis(); return end - start; } } 复制代码

在这里插入图片描述 这时间差一下子就对比出来了。这说明在插入元素方面,LinkedList确实比ArrayList要快许多。

那么在具体情境中,我们还是要根据具体场景去选择使用哪一种。

总结 1、 Arraylist底层是数组结构,LinkedList底层是链表结构,这导致了他们本质的区别。 2、随机访问和查找元素ArrayList要优于LinkedList 3、添加和删除元素LinkedList要优于ArrayList 复制代码 文中有什么遗漏的点或者说得不对的地方,欢迎评论区指出,大家一起探讨学习。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3